# 函数也是一个对象，有其他属性（比如： __name__）
def foo():
    print("foo")

print(foo.__name__)
import functools
# 1、装饰器函数基本使用
def log(fnc):
    # 不改变原函数的__name__值
    @functools.wraps(fnc)
    def wrapper(*arg,**kw):
        print(f'{fnc.__name__}被调用')
        return fnc(*arg,**kw)
    return wrapper
@log
def bar():
    print('唱、跳、rap')
bar()
print(bar.__name__)

# 2、装饰器函数传参
def logname(name):
    def gen(fnc):
        def wrapper(*arg,**kw):
            print(f'logname is {name},被调用')
            return fnc(*arg,**kw)
        return wrapper
    return gen

@logname('zhansgan')
def gkd():
    print('gkd')
gkd()
